package org.adoxx.pn;
import java.util.ArrayList;
import java.util.HashMap;
public class PetriNet implements java.io.Serializable{
private static final long serialVersionUID = 3426953988681102210L;
public class PL implements java.io.Serializable{
private static final long serialVersionUID = 5172052386953796272L;
public String name = "";
public String description = "";
public int numToken = 0;
public boolean excludeFromDeadlockCheck = false;
public String x="0",y="0",w="40.0",h="40.0";
public ArrayList
previousList = new ArrayList
();
public ArrayList
nextList = new ArrayList
();
public HashMap additionalInfoList = new HashMap();
public PetriNet petrinet = null;
public PL(String name){
this.name = name.replaceAll("(\\W|_)+", "");
}
@SuppressWarnings("unchecked")
public ArrayList getPreviousList_safe(){ return (ArrayList
) previousList.clone(); }
@SuppressWarnings("unchecked")
public ArrayList
getNextList_safe(){ return (ArrayList
) nextList.clone(); }
public void addInfo(String name, String value){ additionalInfoList.put(name, value); }
}
public class TR implements java.io.Serializable{
private static final long serialVersionUID = 6525281606058042758L;
public String name = "";
public String description = "";
public String x="0",y="0",w="40.0",h="40.0";
public ArrayList previousList = new ArrayList();
public ArrayList nextList = new ArrayList();
public HashMap additionalInfoList = new HashMap();
public PetriNet petrinet = null;
public TR(String name){
this.name = name.replaceAll("(\\W|_)+", "");
}
@SuppressWarnings("unchecked")
public ArrayList getPreviousList_safe(){ return (ArrayList) previousList.clone(); }
@SuppressWarnings("unchecked")
public ArrayList getNextList_safe(){ return (ArrayList) nextList.clone(); }
public void addInfo(String name, String value){ additionalInfoList.put(name, value); }
}
public class TP implements java.io.Serializable{
private static final long serialVersionUID = 5691467102614286878L;
public TR source;
public PL target;
public int weight=1;
public HashMap additionalInfoList = new HashMap();
public PetriNet petrinet = null;
public TP(TR transition, PL place){
this.source = transition;
this.target = place;
}
public void addInfo(String name, String value){ additionalInfoList.put(name, value); }
}
public class PT implements java.io.Serializable{
private static final long serialVersionUID = -33230958480957514L;
public PL source;
public TR target;
public int weight=1;
public HashMap additionalInfoList = new HashMap();
public PetriNet petrinet = null;
public PT(PL place, TR transition){
this.source = place;
this.target = transition;
}
public void addInfo(String name, String value){ additionalInfoList.put(name, value); }
}
private String name;
private ArrayList placeList = new ArrayList();
private ArrayList transitionList = new ArrayList
();
private ArrayList startList = new ArrayList();
private ArrayList endList = new ArrayList();
private ArrayList connectionPTList = new ArrayList();
private ArrayList connectionTPList = new ArrayList();
public PetriNet(String name){
this.name = name;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void resetNet(){
placeList.clear();
transitionList.clear();
startList.clear();
endList.clear();
connectionPTList.clear();
connectionTPList.clear();
}
public PetriNet clonePN() throws Exception{
java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(512);
java.io.ObjectOutputStream out = new java.io.ObjectOutputStream(bos);
out.writeObject(this);
byte[] bytes = bos.toByteArray();
out.close();
java.io.ObjectInputStream ois = new java.io.ObjectInputStream(new java.io.ByteArrayInputStream(bytes));
PetriNet readObject = (PetriNet) ois.readObject();
ois.close();
return readObject;
}
public void importPN(PetriNet petriNet) throws Exception{
petriNet = petriNet.clonePN();
placeList.addAll(petriNet.placeList);
transitionList.addAll(petriNet.transitionList);
startList.addAll(petriNet.startList);
endList.addAll(petriNet.endList);
connectionPTList.addAll(petriNet.connectionPTList);
connectionTPList.addAll(petriNet.connectionTPList);
}
@SuppressWarnings("unchecked")
public ArrayList getPlaceList_safe(){ return (ArrayList) placeList.clone(); }
public ArrayList getPlaceList(){ return placeList; }
@SuppressWarnings("unchecked")
public ArrayList getTransitionList_safe(){ return (ArrayList
) transitionList.clone(); }
public ArrayList
getTransitionList(){ return transitionList; }
@SuppressWarnings("unchecked")
public ArrayList getStartList_safe(){ return (ArrayList) startList.clone(); }
public ArrayList getStartList(){ return startList; }
@SuppressWarnings("unchecked")
public ArrayList getEndList_safe(){ return (ArrayList) endList.clone(); }
public ArrayList getEndList(){ return endList; }
@SuppressWarnings("unchecked")
public ArrayList getConnectionPTList_safe(){ return (ArrayList) connectionPTList.clone(); }
public ArrayList getConnectionPTList(){ return connectionPTList; }
@SuppressWarnings("unchecked")
public ArrayList getConnectionTPList_safe(){ return (ArrayList) connectionTPList.clone(); }
public ArrayList getConnectionTPList(){ return connectionTPList; }
public boolean isEmpty(){
return placeList.isEmpty() && transitionList.isEmpty();
}
public PL addPlace(String name){
return addPlace(name, 0);
}
public PL addPlace(String name, int numToken){
if(name == null || name.isEmpty())
throw new IllegalArgumentException("ERROR: Name is empty or null");
for(PL place:placeList)
if(place.name.equals(name))
throw new IllegalArgumentException("ERROR: A place with name " + name + " already exist");
PL ret = new PL(name);
ret.numToken = numToken;
ret.petrinet = this;
placeList.add(ret);
//if(numToken>0)
// startList.add(ret);
return ret;
}
public void delPlace(String name){
delPlace(getPlace(name));
}
public void delPlace(PL place){
placeList.remove(place);
endList.remove(place);
startList.remove(place);
for(TR tr0:place.getPreviousList_safe())
delConnection(tr0, place);
for(TR tr0:place.getNextList_safe())
delConnection(place, tr0);
}
public ArrayList getEnabledTransitions(){
return getEnabledTransitions(getCurrentMark());
}
//FIXME: leggere arc weight!!!
public ArrayList
getEnabledTransitions(int[] startingMarkList){
if(startingMarkList == null)
throw new IllegalArgumentException("ERROR: starting mark can not be null");
if(startingMarkList.length != placeList.size())
throw new IllegalArgumentException("ERROR: you have to provide a mark for each place");
ArrayList
enabledList = new ArrayList
();
for(TR transition: transitionList){
boolean isEnabled=true;
for(PL place:transition.previousList)
if(startingMarkList[placeList.indexOf(place)]==0)
isEnabled = false;
if(isEnabled)
enabledList.add(transition);
}
return enabledList;
}
//FIXME: leggere arc weight!!!
public void fireTransition(TR transition){
if(!getEnabledTransitions().contains(transition))
throw new IllegalArgumentException("ERROR: transition " + transition.name + " can not be fired");
for(PL place: transition.previousList)
if(place.numToken>0)
place.numToken--;
for(PL place: transition.nextList)
if(place.numToken>=0)
place.numToken++;
}
public int[] getCurrentMark(){
int[] mark = new int[placeList.size()];
for(int i=0; i newEndList = new ArrayList();
for(PL place:placeList)
if(place.nextList.isEmpty())
newEndList.add(place);
this.endList = newEndList;
}
private void updateStartList(){
ArrayList newStartList = new ArrayList();
for(PL place:placeList)
if(place.numToken>0)
newStartList.add(place);
this.startList = newStartList;
}
public void updateStartListCheckingFlow(){
ArrayList newStartList = new ArrayList();
for(PL place:placeList)
if(place.numToken>0)
newStartList.add(place);
else
if(place.previousList.isEmpty()){
place.numToken = 1;
newStartList.add(place);
}
this.startList = newStartList;
}
/*
public static void main(String[] args) {
try {
PetriNet pn = new PetriNet("test");
PL p0 = pn.addPlace("p0", 1);
TR t0 = pn.addTransition("t0");
PL p1 = pn.addPlace("p1");
TR t1 = pn.addTransition("t1");
//PL p2 = pn.addPlace("p2");
pn.connect(p0, t0);
//pn.connect(p0, t1);
pn.connect(t0, p1);
pn.connect(p1, t1);
//pn.connect(t1, p2);
//pn.delTransition(t0);
//pn.delPlace(p1);
pn.finalizeModel();
System.out.println(PNExport.exportTo_PNML(pn));
} catch (Exception e) {
e.printStackTrace();
}
}
*/
}